// Async / Await 语法糖

function ajax (url) {
    return new Promise(function (resolve, reject) {
        //AJAX请求
        var xhr = new XMLHttpRequest()
        //请求方式和地址
        xhr.open('GET', url)
        //请求类型
        //获取结果为json对象而不是字符串
        xhr.responseType = 'json'
        //请求完成过后执行
        xhr.onload = function () {
            if (this.status === 200) {
                //请求成功 返回请求的结果
                resolve(this.response)
            } else {
                //请求失败 返回错误信息 即当前状态文本
                reject(new Error(this.statusText))
            }
        }
        //开始执行异步请求
        xhr.send()
    }) 
}

//标准的async函数
//await关键词只能出现再async函数内部 不能在外层使用
async function main () {
    try {
        const users = await ajax('/api/users.json')
        console.log(users);

        const posts = await ajax('api/posts.json')
        console.log(posts);
    } catch (e) {
        //捕获执行的异常
        console.log(e);
    }
    
}


function co (generator) {
    const g = generator()

    //递归函数
    function handleResult (result) {
        if (result.done) return  //生成器函数结束

        //未结束则执行回调函数 将结果传给生成器函数 使其继续执行
        result.value.then(data => {
            handleResult(g.next(data))
            //处理失败的回调错误
        }, error => {
            //在生成器内生成一个异常
            g.throw(error)
        })
    }

    //生成器函数第一次调用结果
    handleResult(g.next())
}

// co(main)

//可直接在外面调用该函数
//不需要再配合co这样的执行器 因为是语言层面的异步编程标准
//其次会返回一个promise对象  利于对整体代码进行控制
const promise = main()

promise.then(() => {
    console.log('all comeleted');
})